package 中等.双指针;

/**
 * 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串（例如"RXXLRXRXL"）中进行移动操作。
 * 一次移动操作指用一个"LX"替换一个"XL"，或者用一个"XR"替换一个"RX"。现给定起始字
 * 符串start和结束字符串end，请编写代码，当且仅当存在一系列移动操作使得start可以
 * 转换成end时， 返回True。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/swap-adjacent-in-lr-string
 */
public class 在LR字符串中交换相邻字符_777 {

    public static void main(String[] args) {

        System.out.println(canTransform("RXR", "XXR"));

    }

    /**
     * 1，start 和 end 中 L,R 的相对顺序一致
     * 2，由于 L 只能向左移动，那么 end 中对应的 L 索引必须比 start 中的小或者等于
     * 3，由于 R 只能向右移动，那么 end 中对应的 R 索引必须比 start 中的大或者等于
     *
     * @param start
     * @param end
     * @return
     */
    public static boolean canTransform(String start, String end) {
        if (start.length() != end.length()) {
            return false;
        }
        int sIdx = 0, eIdx = 0;
        while (sIdx < start.length() || eIdx < end.length()) {
            while (sIdx < start.length() && start.charAt(sIdx) == 'X') {
                sIdx++;
            }
            while (eIdx < end.length() && end.charAt(eIdx) == 'X') {
                eIdx++;
            }
            if (sIdx == start.length() && eIdx != end.length() ||
                    eIdx == end.length() && sIdx != start.length()) {
                return false;
            }
            if (sIdx < start.length() && eIdx < end.length()) {
                if (start.charAt(sIdx) != end.charAt(eIdx)) {
                    return false;
                }
                if (start.charAt(sIdx) == 'L' && eIdx > sIdx) {
                    return false;
                }
                if (start.charAt(sIdx) == 'R' && eIdx < sIdx) {
                    return false;
                }
            }

            sIdx++;
            eIdx++;
        }
        return true;
    }


}
